#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <cstdio>
#include <signal.h>

#include <thread>

using namespace std;

int tickets = 10000;

void *GetTicks(void *args)
{
    (void)args;
    while (true)
    {
        if (tickets > 0)
        { 
            usleep(1000);
            printf("%p:%d\n", pthread_self(), tickets--);
        }
        else
        {
            break;
        }
    }
}
int main()
{
    pthread_t t1, t2, t3;
    pthread_create(&t1, nullptr, GetTicks, nullptr);
    pthread_create(&t2, nullptr, GetTicks, nullptr);
    pthread_create(&t3, nullptr, GetTicks, nullptr);

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
    return 0;
}

// void fun()
// {
//     ;
// }
// int main()
// {
//     thread t(fun);
//     return 0;
// }

// // void handler(int s)
// // {
// //     //(char)s;
// //     cout << "/0 exception" << endl;
// // }
// void *threadRoutine(void *args)
// {
//     // signal(SIGFPE, handler);

//     pthread_detach(pthread_self());

//     cout << "new  thread id：" << pthread_self() << endl;

//     int i = 0;
//     // int *data = new int[10];
//     while (true)
//     {
//         cout << "新线程" << (char *)args
//              << "  runing......" << endl;
//         sleep(1);
//         // data[i] = i;
//         // if (i++ == 3)
//         //     break;
//         //  int a = 100;
//         //  a /= 0;
//     }

//     pthread_exit((void *)12);

//     cout << "new thread quit……" << endl;
//     // return (void *)10;
//     // return (void *)data;
// }
// int main21()
// {
//     pthread_t tid; // 本质是个地址
//     pthread_create(&tid, nullptr,
//                    threadRoutine, (void *)"thread 1");
//     printf("%lu,%p\n", tid, tid);

//     int count = 0;
//     while (true)
//     {
//         cout << "main线程"
//              << "  runing......" << endl;
//         sleep(1);
//         count++;
//         if (count >= 3)
//             break;
//     }

//     pthread_cancel(tid);
//     cout << "pthreead_cancel：" << tid << endl;

//     int *ret = nullptr;
//     pthread_join(tid, (void **)&ret); // 默认会阻塞等待新线程退出
//     cout << "main thread wait done…… main quit……：new thread quit: " << endl;
//     // for (int i = 0; i < 11; i++)
//     {
//         cout << (long long)ret << ' ';
//     }
//     cout << endl;

//     // 线程在创建并执行时，线程是需要等待的，
//     // 如果主线程不等待，可能引起类似进程的僵尸问题，导致内存泄漏
//     // while (true)
//     // {
//     //     cout << "main线程"
//     //          << "  runing......" << endl;
//     //     sleep(1);
//     // }
// }